#include <iostream>

using namespace std;

//定义一个模板函数
template <class T>  //声明一个模板，叫做T
T add(T a,T b)  //T是什么类型由实参的类型来决定
{
	cout<<"调用第一个版本的"<<endl;
	return a+b;
}

int add(int a,int b)
{
	cout<<"具体版本的add"<<endl;
	return a+b;
}

template <class T>  //声明一个模板，叫做T
T sub(T a,T b)  //T是什么类型由实参的类型来决定
{
	cout<<"调用第二个版本的"<<endl;
	return a-b;
}

template <class T1,class T2>  //声明二个模板，叫做T1和T2
T2 add(T1 a,T2 b)  //T是什么类型由实参的类型来决定
{
	cout<<"调用第三个版本的"<<endl;
	return a+b;
}

int main()
{
	int a=78;
	int b=89;
	float c=45.3;
	float d=56.3;
	cout<<add(a,b)<<endl; //编译器会将模板函数 T add(T a,T b)翻译成int add(int,int);
	cout<<add(c,d)<<endl; //编译器会将模板函数 T add(T a,T b)翻译成float add(float,float);
	cout<<add(a,c)<<endl;
}